﻿using System.Windows.Forms;

namespace UpwardsTimeClock.Prototype
{

    public abstract class VisualControlBase<T> : SpanningControlBase<T> where T:Visual
    {
        private bool _initialized;

        protected Control VisualControl { get; private set; }

        protected abstract Control CreateVisualControl();

        public VisualControlBase(T config): base(config)
        {
        }

        public override void Initialize(Control.ControlCollection controls)
        {
            if (!_initialized)
            {
                _initialized = true;
                base.Initialize(controls);

                VisualControl = CreateVisualControl();

                controls.Add(VisualControl);

                AnchorStyles anchor = AnchorStyles.None;

                VisualControl.Top = Config.Top;
                VisualControl.Left = Config.Left;

                if (Config.Height == -1)
                {
                    VisualControl.Height = controls.Owner.ClientSize.Height;
                    anchor |= AnchorStyles.Left | AnchorStyles.Right;
                }
                else
                {
                    VisualControl.Height = Config.Height;
                }

                if (Config.Width == -1)
                {
                    VisualControl.Width = controls.Owner.ClientSize.Width;
                    anchor |= AnchorStyles.Top | AnchorStyles.Bottom;
                }
                else
                {
                    VisualControl.Width = Config.Width;
                }

                VisualControl.Anchor = anchor;
            }
        }

        public override void Start()
        {
            base.Start();

            if (Config.ZOrder < 0)
            {
                VisualControl.SendToBack();
            }
            else if (Config.ZOrder > 0)
            {
                VisualControl.BringToFront();
            }

            VisualControl.Show();
        }

        public override void Stop()
        {
            base.Stop();
            VisualControl.Hide();
        }

        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            if (disposing)
            {
                if (VisualControl != null)
                {
                    if (VisualControl.Parent != null)
                    {
                        VisualControl.Parent.Controls.Remove(VisualControl);
                    }
                    VisualControl.Dispose();
                }
            }
        }
    }
}
